#ifndef AVALON_DATASHUTTLETESTER_HPP
#define AVALON_DATASHUTTLETESTER_HPP
#include <cppunit/extensions/HelperMacros.h>
#include "Avalon/SerializationTests/SerializationTests.hpp"

namespace Avalon {
namespace Serialization {
namespace Tests {

  /** \class DataShuttleTester
   *  \brief Base class for testing a Serializer/Deserializer pair.
   *  \author Kamal Mansouri <kranar@hotmail.com>
   */
  class DataShuttleTester : public CPPUNIT_NS::TestFixture {
    public:

      //! Tests shuttling a bool.
      void TestShuttlingBool();

      void TestShuttlingChar();

      void TestShuttlingUnsignedChar();

      void TestShuttlingShort();

      void TestShuttlingUnsignedShort();

      void TestShuttlingInt();

      void TestShuttlingUnsignedInt();

      void TestShuttlingLong();

      void TestShuttlingUnsignedLong();

      void TestShuttlingLongLong();

      void TestShuttlingUnsignedLongLong();

      void TestShuttlingFloat();

      void TestShuttlingDouble();

      void TestShuttlingString();

      void TestShuttlingBuffer();

      void TestShuttlingPolymorphicType();

  protected:

      //! Returns the DataShuttleFactory to test.
      virtual DataShuttleFactory* CreateDataShuttleFactory() = 0;

    private:
      CPPUNIT_TEST_SUITE(DataShuttleTester);
        CPPUNIT_TEST(TestShuttlingBool);
        CPPUNIT_TEST(TestShuttlingChar);
        CPPUNIT_TEST(TestShuttlingUnsignedChar);
        CPPUNIT_TEST(TestShuttlingShort);
        CPPUNIT_TEST(TestShuttlingUnsignedShort);
        CPPUNIT_TEST(TestShuttlingInt);
        CPPUNIT_TEST(TestShuttlingUnsignedInt);
        CPPUNIT_TEST(TestShuttlingLong);
        CPPUNIT_TEST(TestShuttlingUnsignedLong);
        CPPUNIT_TEST(TestShuttlingLongLong);
        CPPUNIT_TEST(TestShuttlingUnsignedLongLong);
        CPPUNIT_TEST(TestShuttlingFloat);
        CPPUNIT_TEST(TestShuttlingDouble);
        CPPUNIT_TEST(TestShuttlingString);
        CPPUNIT_TEST(TestShuttlingBuffer);
        CPPUNIT_TEST(TestShuttlingPolymorphicType);
      CPPUNIT_TEST_SUITE_END_ABSTRACT();
  };
}
}
}

#endif // AVALON_DATASHUTTLETESTER_HPP
